
/* Header for class ndk_JNInvoke */
#include "ndk_JNInvoke.h"

/*
 * Class:     com_app_JNInvoke
 * Method:    modifyChars
 * Signature: ()Ljava/lang/String;
 */
JNIEXPORT void JNICALL Java_ndk_JNInvoke_modifyChars
  (JNIEnv *env, jobject jobj)
{

	// 获取varName属性，并修改成Jack
	
	// 通过jobject获取jclass
	jclass j_clz = (*env)->GetObjectClass(env, jobj);

	// 通过jclass获取jfield
	jfieldID j_fid = (*env)->GetFieldID(env,j_clz,"varName","Ljava/lang/String;");

	// 通过jfield获取varName属性值
	jstring j_str = (*env)->GetObjectField(env,jobj,j_fid);

	// 将jstring转换为c语言的char
	const char* c_str = (*env)->GetStringUTFChars(env,j_str,NULL);

	// 打印转换出来的字符串
	printf("JNI环境中，Java层传递过来的字符串：%s\n",c_str);

	// 将C语言中的字符串转换为JNI中的字符串
	jstring jackName = (*env)->NewStringUTF(env,"Jack");
	// 通过env桥梁修改Java层的字符串变量
	(*env)->SetObjectField(env,jobj,j_fid,jackName);

}

/*
 * Class:     com_app_JNInvoke
 * Method:    modifyAge
 * Signature: ()V;
 */
JNIEXPORT void JNICALL Java_ndk_JNInvoke_modifyAge
  (JNIEnv *env, jclass jcls)
{
	// 获取jfield
	jfieldID j_fid = (*env)->GetStaticFieldID(env,jcls,"varAge","I");
	
	// 获取Java层的静态varAge，传递到JNI层
	jint old_age = (*env)->GetStaticIntField(env,jcls,j_fid);
	
	// 打印转换出来的字符串
	printf("JNI环境中，Java层传递过来的静态变量：%d\n",old_age);
	
	// JNI层数据类型转换到C层数据类型 jint -> int
	//const int c_age = (*env)->G
	old_age += 12;

	// 修改Java层的varAge
	(*env)->SetStaticIntField(env,jcls,j_fid,old_age);

}


/*
 * Class:     com_app_JNInvoke
 * Method:    add
 * Signature: ()V;
 */
JNIEXPORT void JNICALL Java_ndk_JNInvoke_callAddMethod
  (JNIEnv *env, jobject jobj)
{
	// 获取jclass
	jclass j_clz = (*env)->GetObjectClass(env,jobj);
	// 获取methodID
	jmethodID j_mid = (*env)->GetMethodID(env,j_clz,"add","(II)I");
	// JNI层调用Java层方法
	jint sum = (*env)->CallIntMethod(env,jobj,j_mid,2,3);

	printf("JNI环境中，sum = %d\n",sum); 
}


/*
 * Class:     com_app_JNInvoke
 * Method:    callUUID
 * Signature: (ILjava/lang/String;)Ljava/lang/String;
 */
JNIEXPORT jstring JNICALL Java_ndk_JNInvoke_callUUID
  (JNIEnv *env, jclass jcls, jint from, jstring to)
{
	// 获取Java层静态方法
	jmethodID j_mid = (*env)->GetStaticMethodID(env,jcls,"getUUID","()Ljava/lang/String;");
	// JNI调用Java的方法
	jstring j_uuid = (*env)->CallStaticObjectMethod(env,jcls,j_mid);
	// jstring -> c_str
	const char* c_uuid = (*env)->GetStringUTFChars(env,j_uuid,NULL);

	printf("c_uuid = %s\n",c_uuid);

	return (*env)->NewStringUTF(env,"aaa");
}

